package other.p6002;

class Bitset {
    private boolean[] bits;

    public Bitset(int size) {
        bits = new boolean[size];
    }

    public void fix(int idx) {
        bits[idx] = true;
    }

    public void unfix(int idx) {
        bits[idx] = false;
    }

    public void flip() {
        for (int i = 0; i < bits.length; i++) {
            bits[i] = !bits[i];
        }
    }

    public boolean all() {
        for (int i = 0; i < bits.length; i++) {
            if (!bits[i])
                return false;
        }
        return true;
    }

    public boolean one() {
        for (int i = 0; i < bits.length; i++) {
            if (bits[i])
                return true;
        }
        return false;
    }

    public int count() {
        int count = 0;
        for (int i = 0; i < bits.length; i++) {
            if (bits[i])
                count++;
        }
        return count;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < bits.length; i++) {
            sb.append(bits[i] ? '1' : '0');
        }
        return sb.toString();
    }


    public static void main(String[] args) {
        Bitset bs = new Bitset(5); // bitset = "00000".
        System.out.println("bs = " + bs);
        bs.fix(3);     // 将 idx = 3 处的值更新为 1 ，此时 bitset = "00010" 。
        System.out.println("bs = " + bs);
        bs.fix(1);     // 将 idx = 1 处的值更新为 1 ，此时 bitset = "01010" 。
        System.out.println("bs = " + bs);
        bs.flip();     // 翻转每一位上的值，此时 bitset = "10101" 。
        System.out.println("bs = " + bs);
        bs.all();      // 返回 False ，bitset 中的值不全为 1 。
        System.out.println("bs = " + bs);
        bs.unfix(0);   // 将 idx = 0 处的值更新为 0 ，此时 bitset = "00101" 。
        bs.flip();     // 翻转每一位上的值，此时 bitset = "11010" 。
        System.out.println("bs = " + bs);
        bs.one();      // 返回 True ，至少存在一位的值为 1 。
        System.out.println("bs = " + bs);
        bs.unfix(0);   // 将 idx = 0 处的值更新为 0 ，此时 bitset = "01010" 。
        System.out.println("bs = " + bs);
        System.out.println("bs.count() = " + bs.count());    // 返回 2 ，当前有 2 位的值为 1 。
        System.out.println("bs.toString() = " + bs.toString()); // 返回 "01010" ，即 bitset 的当前组成情况。
    }
}

/**
 * Your Bitset object will be instantiated and called as such:
 * Bitset obj = new Bitset(size);
 * obj.fix(idx);
 * obj.unfix(idx);
 * obj.flip();
 * boolean param_4 = obj.all();
 * boolean param_5 = obj.one();
 * int param_6 = obj.count();
 * String param_7 = obj.toString();
 */